home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir35 / baggrep.zip / GREP.CB < prev    next >
Text File  |  1993-03-18  |  12KB  |  370 lines

  1. /****************************************************************************
  2. *
  3. *   grep.cb                                             18Mar93
  4. *
  5. *   Search entire set of buffers for string
  6. *
  7. *   Contains macros:
  8. *       grep
  9. *       _show_list
  10. *       _get_file_line
  11. *       _save_and_exit
  12. *
  13. *   Copyright (c) 1990-1993 B. Goldstein -- Pequod Software
  14. *
  15. *   Change History (see also individual entries):
  16. *   Date    Who What
  17. *   ------- --- --------------
  18. *   17Apr90 BAG First taken from Brief BBS miscellaneous stuff
  19. *   09Jun90 BAG Added line to show grep search pattern
  20. *   20Jun92 BAG grep has to check search _dir for search_again positioning
  21. *   17Mar93 BAG Added option of preserving grep buffer across calls
  22. *   18Mar93 BAG Changed option so default is saving buffer
  23. *
  24. ****************************************************************************/
  25. /*  Definitions     */
  26.  
  27. #include <cbrief.h>
  28.  
  29. /***************************************************************************/
  30. /*  Externals       */
  31.  
  32. extern int _reg_exp;
  33.  
  34. extern string _s_pat;
  35.  
  36. // save grep buffer across calls
  37. int list_buffer;
  38. string _save_pattern;
  39.  
  40. // cross-macro "statics"
  41. int _save_grep_list;
  42. int _grep_line;
  43. string _grep_file;
  44.  
  45. // Prototypes
  46. void grep (void);
  47. void _show_list (int orig_buffer, string pattern);
  48. void _get_file_line (void);
  49. void _save_and_exit (void);
  50.  
  51. /***************************************************************************/
  52.  
  53. /****************************************************************************
  54. *
  55. *   grep                                                17Mar93
  56. *
  57. *   Takes a search expression and searches all of all the buffers being
  58. *       edited
  59. *
  60. *   Change History:
  61. *   Date    Who What
  62. *   ------- --- -----------------
  63. *   17Apr90 BAG First draft
  64. *   22Jun92 BAG Slightly better coding
  65. *   17Mar93 BAG Added option of preserving grep buffer across calls
  66. *
  67. ****************************************************************************/
  68.  
  69. void grep (void)
  70.  
  71.  {  int ret_code,
  72.         line_at,
  73.         end_col,
  74.         case_flag,
  75.         sta_buffer,
  76.         num_bufs,
  77.         cur_buffer,
  78.         i;
  79.  
  80.     string buf, 
  81.            full_name,
  82.            pattern,
  83.            prompt;
  84.  
  85.     /*  Initialize for grep  */
  86.  
  87.     sta_buffer = inq_buffer ();
  88.     save_position ();  /*  save the current position  */
  89.     _grep_file = "";
  90.     _grep_line = 0;
  91.     _save_grep_list = TRUE;
  92.  
  93.     case_flag = search_case ();  /* find out what it is */
  94.     search_case (case_flag);     /* and put it back that way */
  95.  
  96.     // Talk to the user
  97.     sprintf (prompt, "Search %s%sall files for: ", 
  98.                                   _reg_exp ? "" : "(RE off) ",
  99.                                                   case_flag ? "(a=A) " : "");
  100.     if (list_buffer != 0)
  101.         pattern = "";    // if prior grep, set up for no pattern and re-use
  102.     else
  103.         pattern = _s_pat;
  104.     ret_code = get_parm (0, pattern, prompt, NULL, pattern);
  105.     if (! ret_code)
  106.         return;
  107.  
  108.     if (pattern == "" && list_buffer == 0)
  109.      {  error ("No pattern and no prior grep");
  110.         return;
  111.      }
  112.  
  113.     /* how many buffers we got? */
  114.     cur_buffer = 0;
  115.     while (sta_buffer != cur_buffer)  
  116.      {  ++num_bufs;
  117.         cur_buffer = next_buffer ();
  118.         set_buffer (cur_buffer);
  119.      }
  120.     // exits loop with cur_buffer == sta_buffer (original, user's buffer)
  121.  
  122.     if (pattern != "" && list_buffer != 0)
  123.      {  delete_buffer (list_buffer);
  124.         list_buffer = 0;
  125.      }
  126.  
  127.     if (pattern == "")  // list_buffer must not be 0
  128.      {  pattern = _save_pattern;
  129.         message ("Grep'ed earlier for %s", pattern);
  130.      }
  131.     else // Generate new list buffer
  132.      {  list_buffer = create_buffer ("grep list", NULL, SYSTEM_BUFF);
  133.  
  134.         for (i = 0; i < num_bufs; i++)
  135.          {  inq_names (full_name, NULL, buf);
  136.             message ("Searching %s for %s", buf, pattern);
  137.  
  138.             save_position ();
  139.  
  140.             top_of_buffer ();  // start at the top of current user buffer
  141.  
  142.             set_buffer (list_buffer); /* put title in grep buffer */
  143.             insert ("\n");
  144.             insert (full_name);
  145.             insert ("\n\n");
  146.  
  147.             set_buffer (cur_buffer);    /* initially, the starting buffer */
  148.  
  149.             /* search for the pattern */
  150.             while (search_fwd (pattern, _reg_exp))
  151.              {  beginning_of_line ();
  152.                 inq_position (line_at, NULL);
  153.                 end_of_line ();
  154.                 inq_position (NULL, end_col);
  155.  
  156.                 /*  switch to list buffer */
  157.                 set_buffer (list_buffer);
  158.  
  159.                 /*  put in the line number */
  160.                 insert (" %5d: ", line_at);
  161.  
  162.                 /*  copy in the line */
  163.                 transfer (cur_buffer, line_at, 1, line_at, end_col);
  164.  
  165.                 /*  return to user current buffer */
  166.                 set_buffer (cur_buffer);
  167.                 move_abs (++line_at, 1);
  168.              }
  169.  
  170.             restore_position (MOVE);
  171.  
  172.             // Allow for quitting after each buffer
  173.             if (inq_kbd_char ())   /*  see if any keys pressed  */
  174.              {  read_char ();      /*   swallow the key  */
  175.                 set_buffer (sta_buffer); // as if we'd finished the loop
  176.                 i++;    // we did finish this file
  177.                 break;  
  178.              }
  179.  
  180.             cur_buffer = next_buffer ();
  181.             set_buffer (cur_buffer);
  182.          }
  183.         // Either way out of loop, back at user's original buffer
  184.         //  (cur_buffer not necessarily set to sta_buffer)
  185.  
  186.         if (i == num_bufs)
  187.             message ("Grep'ed %d file%s for %s", 
  188.                                           i, ((i == 1) ? "" : "s"), pattern);
  189.         else 
  190.             message ("Grep'ed %d of %d file%s for %s", 
  191.                          i, num_bufs, ((num_bufs == 1) ? "" : "s"), pattern);
  192.  
  193.      }
  194.  
  195.     /*  Now that we've searched all of the buffers in memory,   */
  196.     /*    let's display the fruits of our labor.                */
  197.  
  198.     _show_list (sta_buffer, pattern);
  199.  
  200.     restore_position (MOVE);              /*  restore the position */
  201.  
  202.     // See if we're to delete the grep list buffer
  203.     if (! _save_grep_list)
  204.      {  delete_buffer (list_buffer);
  205.         list_buffer = 0;
  206.         message ("grep %s done.", pattern);
  207.      }
  208.     else 
  209.      {  _save_pattern = pattern;
  210.         message ("grep %s done (list saved).", pattern);
  211.      }
  212.  
  213.     // Now that we're saving grep results for re-use, the file may be gone
  214.     if (_grep_file != "")
  215.      {  /* move to that file */
  216.         for (i = 0; i < num_bufs; i++)
  217.          {  inq_names (full_name, NULL, NULL);
  218.             if (full_name == _grep_file)
  219.                 break;
  220.             set_buffer (next_buffer ());
  221.          }
  222.         if (i == num_bufs)  // didn't find it
  223.          {  error ("File %s no longer around", _grep_file);
  224.             set_buffer (sta_buffer);
  225.          }
  226.         else 
  227.          {  attach_buffer (inq_buffer ());
  228.  
  229.             if (_grep_line != 0)
  230.              {  move_abs (_grep_line, 1);
  231.  
  232.                 if (search_fwd (pattern+"|\\n", _reg_exp) <= 0 
  233.                                                         || read (1) == "\\n")
  234.                     error ("Can't find %s in line %d", pattern, _grep_line);
  235.                 else 
  236.                     _s_pat = pattern; //@@@ Do we want to do this elsewhere?
  237.              }
  238.          }
  239.      }
  240.  } 
  241.  
  242. /****************************************************************************
  243. *
  244. *   _show_list                                          18Mar93
  245. *
  246. *   Let user view search results
  247. *
  248. *   Change History:
  249. *   Date    Who What
  250. *   ------- --- --------------
  251. *   17Apr90 BAG First draft
  252. *   18Apr90 BAG Changed to overlapping window
  253. *   09Jun90 BAG Added pattern to messages
  254. *   17Mar93 BAG Added option of preserving grep buffer across calls
  255. *
  256. ****************************************************************************/
  257.  
  258. void _show_list (int org_buffer, string pattern)
  259.  
  260.  {  int lines,cols;
  261.  
  262.     inq_screen_size (lines, cols);
  263.     create_window (2,lines-5, cols-4,2, "Press Esc to exit, Enter to edit");
  264.  
  265.     set_buffer (list_buffer);             /*  switch to list buffer */
  266.     attach_buffer (list_buffer);          /*  let's see our handiwork */
  267.  
  268.     top_of_buffer ();
  269.     refresh ();
  270.  
  271.     keyboard_push ();                           /*  allow only certain keys */
  272.     assign_to_key ("%#73", "page_up");                  /*  PgUp */
  273.     assign_to_key ("%#81", "page_down");                /*  PgDn */
  274.     assign_to_key ("#27", "_save_and_exit");            /*  Esc */
  275.     assign_to_key ("<Up>", "scroll_sensitive_up");      /* arrow keys */
  276.     assign_to_key ("<Down>", "scroll_sensitive_down");
  277.     assign_to_key ("<Left>", "scroll_sensitive_left");
  278.     assign_to_key ("<Right>", "scroll_sensitive_right");
  279.     assign_to_key ("#20224", "_end");                   /*  End */
  280.     assign_to_key ("#18176", "_home");                  /*  Home */
  281.     assign_to_key ("#13", "_get_file_line");            /*  Enter */
  282.  
  283.     process ();  /* exit returns to point after this */
  284.  
  285.     keyboard_pop ();
  286.  
  287.     delete_window ();                  /*  get rid of window */
  288.  
  289.     set_buffer (org_buffer);           /*  return to user's buffer */
  290.     attach_buffer (org_buffer);        /*  get back to normal */
  291.  
  292.     return;
  293.  }
  294.  
  295. /****************************************************************************
  296. *
  297. *   _get_file_line                                      18Mar93
  298. *
  299. *   Scans grep list buffer when a line is selected by enter
  300. *
  301. *   Shift-Enter means save list buffer
  302. *
  303. *   Sets _grep_file and _grep_line for use in main grep routine to
  304. *       switch to that file at that line
  305. *
  306. *   Change History:
  307. *   Date    Who What
  308. *   ------- --- --------------
  309. *   17Apr90 BAG First draft
  310. *   18Mar93 BAG Look for Shift key to delete grep list buffer
  311. *
  312. ****************************************************************************/
  313.  
  314. void _get_file_line (void)
  315.  
  316.  {  string line_prefix;
  317.     int l_prefix;
  318.     int line;
  319.  
  320.     if ((inq_kbd_flags () & (LEFT_SHIFT | RIGHT_SHIFT)))
  321.         _save_grep_list = FALSE;
  322.  
  323.     beginning_of_line ();
  324.     l_prefix = search_fwd ("{< +[0-9]+:}|{\\n}") - 2;
  325.     if (l_prefix)
  326.      {  line_prefix = read (l_prefix);
  327.         _grep_line = atoi (line_prefix);
  328.      }
  329.  
  330.     beginning_of_line ();
  331.     while (FOREVER)
  332.      {  line_prefix = read (1);
  333.         if (line_prefix != "\n" && line_prefix != " ")
  334.          {  _grep_file = trim (read ());
  335.             break; 
  336.          }
  337.         inq_position (line);
  338.         if (line == 1)
  339.             break;
  340.         up ();
  341.      }
  342.  
  343.     exit ();   /* return to after process call */
  344.  }
  345.  
  346. /****************************************************************************
  347. *
  348. *   _save_and_exit                                      18Mar93
  349. *
  350. *   Just like exit (from process viewing grep list) but checks for shift key
  351. *   to see if we want to delete the list buffer
  352. *
  353. *   Change History:
  354. *   Date    Who What
  355. *   ------- --- -------------
  356. *   18Mar93 BAG First draft
  357. *
  358. ****************************************************************************/
  359.  
  360. void _save_and_exit ()
  361.  
  362.  {  
  363.     if ((inq_kbd_flags () & (LEFT_SHIFT | RIGHT_SHIFT)))
  364.         _save_grep_list = FALSE;
  365.  
  366.     exit ();
  367.  }
  368.  
  369. /**************************** end of grep.cb file **************************/
  370.